<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  
  <title>Supervisor | gdme1320 的笔记</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="Table of Contents   平台需要 组件 配置文件  [program:x]  command process_name numprocs numprocs_start priority autostart startsecs startretries autorestart exitcodes stopsignal stopwaitsecs stopasgroup killa">
<meta property="og:type" content="article">
<meta property="og:title" content="Supervisor">
<meta property="og:url" content="http://gdme1320.gitee.com/python/supervisor/index.html">
<meta property="og:site_name" content="gdme1320 的笔记">
<meta property="og:description" content="Table of Contents   平台需要 组件 配置文件  [program:x]  command process_name numprocs numprocs_start priority autostart startsecs startretries autorestart exitcodes stopsignal stopwaitsecs stopasgroup killa">
<meta property="og:locale" content="default">
<meta property="og:updated_time" content="2022-03-23T09:59:18.257Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Supervisor">
<meta name="twitter:description" content="Table of Contents   平台需要 组件 配置文件  [program:x]  command process_name numprocs numprocs_start priority autostart startsecs startretries autorestart exitcodes stopsignal stopwaitsecs stopasgroup killa">
  
    <link rel="alternate" href="/atom.xml" title="gdme1320 的笔记" type="application/atom+xml">
  
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" integrity="sha384-XdYbMnZ/QjLh6iI4ogqCTaIjrFk87ip+ekIjefZch0Y+PvJ8CDYtEs1ipDmPorQ+" crossorigin="anonymous">

  <link rel="stylesheet" href="/css/styles.css">
  <link rel="stylesheet" href="/css/docs.min.css">
  

</head>
</html>
<body>
  <nav class="navbar navbar-inverse">
  <div class="container">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#main-menu-navbar" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="main-menu-navbar">
      <ul class="nav navbar-nav">
        
          <li><a class href="/index.html">Home</a></li>
        
          <li><a class href="/archives/">Archives</a></li>
        
      </ul>

      <!--
      <ul class="nav navbar-nav navbar-right">
        
          <li><a href="/atom.xml" title="RSS Feed"><i class="fa fa-rss"></i></a></li>
        
      </ul>
      -->
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

  <div class="container bs-docs-container">
  
    <div class="row">
        <div class="col-sm-8 blog-main">
          <article id="post-python/supervisor" class="article article-type-post" itemscope itemprop="blogPost">

  <header class="article-header">
    
  
    <h1 class="article-title" itemprop="name">
      Supervisor
    </h1>
  


  </header>

  <div class="article-meta">
    <div class="article-datetime">
  <a href="/python/supervisor/" class="article-date"><time datetime="2018-07-31T16:00:00.000Z" itemprop="datePublished">2018-08-01</time></a>
</div>

    
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/python/">python</a>
  </div>


  </div>
  <div class="article-inner">

    <div class="article-entry" itemprop="articleBody">
      
        
<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org998598b">平台需要</a></li>
<li><a href="#org734b39f">组件</a></li>
<li><a href="#orge3412f7">配置文件</a>
<ul>
<li><a href="#org138ce08">[program:x]</a>
<ul>
<li><a href="#org441a823">command</a></li>
<li><a href="#orgaee9bd8">process_name</a></li>
<li><a href="#org628263d">numprocs</a></li>
<li><a href="#orgb659393">numprocs_start</a></li>
<li><a href="#org8d1b476">priority</a></li>
<li><a href="#org6912c40">autostart</a></li>
<li><a href="#org7a18d1f">startsecs</a></li>
<li><a href="#orga4a6e63">startretries</a></li>
<li><a href="#org2dcb912">autorestart</a></li>
<li><a href="#org053977e">exitcodes</a></li>
<li><a href="#org5743dca">stopsignal</a></li>
<li><a href="#orgbe2b41f">stopwaitsecs</a></li>
<li><a href="#org2918800">stopasgroup</a></li>
<li><a href="#orgf60b379">killasgroup</a></li>
<li><a href="#org1b2221a">user</a></li>
<li><a href="#orgdc41371">redirect_stderr</a></li>
<li><a href="#org8d7c2fb">stdout_logfile</a></li>
<li><a href="#org72a75d8">stdout_logfile_maxbytes</a></li>
<li><a href="#org1aacb99">stdout_logfile_backups</a></li>
<li><a href="#org890a5c2">stdout_capture_maxbytes</a></li>
<li><a href="#orgd8bcd43">stdout_events_enabled</a></li>
<li><a href="#org22f470b">stderr_logfile stderr_logfile_maxbytes stderr_logfile_backups stderr_capture_maxbytes stderr_events_enabled</a></li>
<li><a href="#orgd239677">environment</a></li>
<li><a href="#orgf7d988e">directory</a></li>
<li><a href="#org1d4e777">umask</a></li>
<li><a href="#org8bc0f71">serverurl</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#orgf0535bb">使用</a></li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-org998598b">
<h2 id="org998598b">平台需要</h2>
<div class="outline-text-2" id="text-org998598b">
<p>
大部分linux，unix。不支持windows。
</p>
<p>
python2.4以上，但是不支持python3
</p>
</div>
</div>
<div class="outline-2" id="outline-container-org734b39f">
<h2 id="org734b39f">组件</h2>
<div class="outline-text-2" id="text-org734b39f">
<dl class="org-dl">
<dt>supervisord</dt><dd>服务端，用于启动子进程，响应客户端的请求，重启崩溃或退出的子进程等。它的配置文件一般在  /etc/supervisord.conf  。</dd>
<dt>supervisorctl</dt><dd>命令行客户端。</dd>
</dl>
<p>
能够通过UNIX domain socket或TCP的方式连接到supervisor服务。
这个客户端使用与supervisord相同的配置文件（[supervisorctl]小节）
</p>
<dl class="org-dl">
<dt>Web Server</dt><dd>简单的web UI，提供列表、控制等功能。</dd>
<dt>XML-RPC 接口</dt><dd>rpc接口，其他程序能够使用这个接口与supervisor服务交互。</dd>
</dl>
</div>
</div>
<div class="outline-2" id="outline-container-orge3412f7">
<h2 id="orge3412f7">配置文件</h2>
<div class="outline-text-2" id="text-orge3412f7">
<p>
配置文件的一般位置在  /etc/supervisord.conf  。
文件是windows-ini风格的。
需要注意配置文件的权限，因为其中包含了未加密的用户名和密码。
</p>
<p>
centos通过yum安装的supervisor的配置文件在  /etc/supervisord.conf  ，在最后一行能看到 include 小节，包含所有 <i>etc/supervisord.d/*.ini 文件。
因此，要守护的程序的配置文件能够放置到 /etc/supervisord.d</i> 目录下，需要以ini作为后缀。
</p>
</div>
<div class="outline-3" id="outline-container-org138ce08">
<h3 id="org138ce08">[program:x]</h3>
<div class="outline-text-3" id="text-org138ce08">
<p>
定义需要supervisor守护的程序。其中的x是名称（必须），例如  [program:apache]  。program小节下的键值如下：
</p>
</div>
<div class="outline-4" id="outline-container-org441a823">
<h4 id="org441a823">command</h4>
<div class="outline-text-4" id="text-org441a823">
<p>
用于启动应用程序的命令。命令使用绝对路径和相对路径，使用相对路径时，检索的是supervisord PATH环境变量。
</p>
<p>
command能够使用参数，如果参数中有空格，则使用双引号。例如  /path/to/program/name -p "foo bar" 
</p>
<p>
command的支持python表达式，例如  /path/to/programname --port=80%(process_num)02d  其中的process_num是变量，支持的变量有：
</p>
<ul class="org-ul">
<li>group_name</li>
<li>host_node_name</li>
<li>process_num</li>
<li>program_name</li>
<li id="here">配置文件的路径</li>
<li>所有的supervisord环境变量，以 ENV_ 开始的</li>
</ul>
<p>
被启动的应用程序不应该以后台的方式运行。
最简单的办法判断一个程序是否是以daemon运行就是在shell中调用它，如果需要ctrl-c来结束进程，那么它就不是daemon的；
如果它将shell的控制权返回了，但是通过ps等命令能看到它的进程，那么程序就是daemon的。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgaee9bd8">
<h4 id="orgaee9bd8">process_name</h4>
<div class="outline-text-4" id="text-orgaee9bd8">
<p>
进程的名称，supervisord能够启动同一程序的多个实例，使用这个配置为实例命名。如果只启动一个实例则不需要关心这个配置。
</p>
<p>
默认是 %(program_name)s ，这是一个表达式，表达式中支持的变量有：
group_name, host_node_name, process_num, program_name, and here (the directory of the supervisord config file).
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org628263d">
<h4 id="org628263d">numprocs</h4>
<div class="outline-text-4" id="text-org628263d">
<p>
需要启动实例的数量。如果多于1个，则process_name必须包含 %(process_num)s ，或者其他包含 process_num 的有效python字符串表达式。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgb659393">
<h4 id="orgb659393">numprocs_start</h4>
<div class="outline-text-4" id="text-orgb659393">
<p>
numprocs的起始数量？？默认是0。
实际实例数量 = numprocs - numprocs_start ？？意义不明。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org8d1b476">
<h4 id="org8d1b476">priority</h4>
<div class="outline-text-4" id="text-org8d1b476">
<p>
优先级，当执行例如start all，stop all的操作的时候，优先级高的被最先启动，最后停止。默认999
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org6912c40">
<h4 id="org6912c40">autostart</h4>
<div class="outline-text-4" id="text-org6912c40">
<p>
程序是否随supervisord一起启动，默认是true
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org7a18d1f">
<h4 id="org7a18d1f">startsecs</h4>
<div class="outline-text-4" id="text-org7a18d1f">
<p>
一个程序在启动之后，需要保持运行状态这么多秒之后，才会被当作成功启动（状态从STARTING到RUNNING）。
</p>
<p>
如果程序在这么多秒前退出了，即使它返回了正常的exit code（see exit code），它仍然被当作失败的启动。
</p>
<p>
默认为1（1秒）设置成0表示程序不需要运行指定的时间。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orga4a6e63">
<h4 id="orga4a6e63">startretries</h4>
<div class="outline-text-4" id="text-orga4a6e63">
<p>
如果程序启动失败了，supervisord将重启这么多次，这么多次都失败后，进入FATAL状态。
</p>
<p>
默认为3
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org2dcb912">
<h4 id="org2dcb912">autorestart</h4>
<div class="outline-text-4" id="text-org2dcb912">
<p>
程序在RUNNING状态（非程序在STARTING状态下退出的情况）时退出后，supervisord是否应该重启它。有如下几个值：
</p>
<dl class="org-dl">
<dt>false</dt><dd>不重启</dd>
<dt>unexpected</dt><dd>默认值。如果程序的exit code不是exitcodes中配置的，程序将被重启。</dd>
<dt>true</dt><dd>问题重启，无论什么exit code</dd>
</dl>
<p>
程序在STARTING状态下退出时的处理与这个配置无关，而是与startsecs和startretries的配置有关的。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org053977e">
<h4 id="org053977e">exitcodes</h4>
<div class="outline-text-4" id="text-org053977e">
<p>
列表，autorestart使用的，if autorestart=unexpected，and not supervsirod停止的，and 进程的exit code in exitcodes（这个配置），then restart。
</p>
<p>
默认是0,2
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org5743dca">
<h4 id="org5743dca">stopsignal</h4>
<div class="outline-text-4" id="text-org5743dca">
<p>
stop请求发生的时候，用于结束进程的信号。值为TERM, HUP, INT, QUIT, KILL, USR1, or USR2。
</p>
<p>
默认是TERM
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgbe2b41f">
<h4 id="orgbe2b41f">stopwaitsecs</h4>
<div class="outline-text-4" id="text-orgbe2b41f">
<p>
stop请求，发送了stopsignal之后，等待的时间（单位秒）。如果等待超时之后，supervisord向进程发送终极信号SIGKILL。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org2918800">
<h4 id="org2918800">stopasgroup</h4>
<div class="outline-text-4" id="text-org2918800">
<p>
停止进程组
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgf60b379">
<h4 id="orgf60b379">killasgroup</h4>
<div class="outline-text-4" id="text-orgf60b379">
<p>
发送SIGKILL的时候，向整个进程组发送。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org1b2221a">
<h4 id="org1b2221a">user</h4>
<div class="outline-text-4" id="text-org1b2221a">
<p>
进行运行的用户。只有当supervisord以root运行的时候才有权限切换进程运行用户，如果supervisord没能切换用户，则进程不会被启动。
</p>
<p>
进行仅仅是通过setuid被更改执行用户，而不会启动一个login shell，也不会更改USER HOME之类的环境变量。
</p>
<p>
默认不更改用户。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgdc41371">
<h4 id="orgdc41371">redirect_stderr</h4>
<div class="outline-text-4" id="text-orgdc41371">
<p>
/the/program 2&gt;&amp;1
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org8d7c2fb">
<h4 id="org8d7c2fb">stdout_logfile</h4>
<div class="outline-text-4" id="text-org8d7c2fb">
<p>
进程的stdout的文件，除了指定路径，还能使用下面的值：
</p>
<dl class="org-dl">
<dt>AUTO</dt><dd>默认。由supervisord自动选择，supervisord重启后这些文件与备份被删除。</dd>
<dt>NONE</dt><dd>不重定向到文件</dd>
</dl>
<p>
不能使用表达式，能够使用的变量有：group_name, host_node_name, process_num, program_name, and here
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org72a75d8">
<h4 id="org72a75d8">stdout_logfile_maxbytes</h4>
<div class="outline-text-4" id="text-org72a75d8">
<p>
用于支持滚动日志，单位有KB MB GB，设置为0表示无大小限制。
</p>
<p>
默认值是50MB
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org1aacb99">
<h4 id="org1aacb99">stdout_logfile_backups</h4>
<div class="outline-text-4" id="text-org1aacb99">
<p>
滚动日志文件保留的备份数量，如果设置为0表示不保留任何备份。
</p>
<p>
默认是10
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org890a5c2">
<h4 id="org890a5c2">stdout_capture_maxbytes</h4>
<div class="outline-text-4" id="text-org890a5c2">
<p>
TODO Capture Mode
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgd8bcd43">
<h4 id="orgd8bcd43">stdout_events_enabled</h4>
<div class="outline-text-4" id="text-orgd8bcd43">
<p>
写stdout文件时，产生PROCESS_LOG_STDOUT事件。
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org22f470b">
<h4 id="org22f470b">stderr_logfile stderr_logfile_maxbytes stderr_logfile_backups stderr_capture_maxbytes stderr_events_enabled</h4>
<div class="outline-text-4" id="text-org22f470b">
<p>
redirect_stderr 为false时生效
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgd239677">
<h4 id="orgd239677">environment</h4>
<div class="outline-text-4" id="text-orgd239677">
<p>
进程能够继承supervisord的环境变量，这里能定义额外的，或者重写继承的环境变量。
进程的环境变量，键值对形式例如  KEY="val",KEY2="val2" 
</p>
<p>
支持表达式，表达式的变量有group_name, host_node_name, process_num, program_name, and here
</p>
</div>
</div>
<div class="outline-4" id="outline-container-orgf7d988e">
<h4 id="orgf7d988e">directory</h4>
<div class="outline-text-4" id="text-orgf7d988e">
<p>
执行命令时临时chdir
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org1d4e777">
<h4 id="org1d4e777">umask</h4>
<div class="outline-text-4" id="text-org1d4e777">
<p>
进程umask
</p>
</div>
</div>
<div class="outline-4" id="outline-container-org8bc0f71">
<h4 id="org8bc0f71">serverurl</h4>
<div class="outline-text-4" id="text-org8bc0f71">
<p>
一个URL，以SUPERVISOR_SERVER_URL环境变量传递给子进程，让子进程与内部的HTTP服务器更方便交流。
TODO
</p>
</div>
</div>
</div>
</div>
<div class="outline-2" id="outline-container-orgf0535bb">
<h2 id="orgf0535bb">使用</h2>
</div>
</div>
<div class="status" id="postamble">
<p class="date">Date: 2018-8-1</p>
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer" target="_blank" rel="noopener">Validate</a></p>
</div>

      
    </div>

    
      

    

    <footer class="article-footer">
      <a data-url="http://gdme1320.gitee.com/python/supervisor/" data-id="cl13eo7k8008zhjv4ch74d6bo" class="article-share-link">
        <i class="fa fa-share"></i> Share
      </a>
      
      

    </footer>
  </div>
  
    
<ul id="article-nav" class="nav nav-pills nav-justified">
  
  <li role="presentation">
    <a href="/java/maven/" id="article-nav-older" class="article-nav-link-wrap">
      <i class="fa fa-chevron-left pull-left"></i>
      <span class="article-nav-link-title">maven笔记</span>
    </a>
  </li>
  
  
  <li role="presentation">
    <a href="/python/http-server/" id="article-nav-newer" class="article-nav-link-wrap">
      <span class="article-nav-link-title">Python3 简单HTTP服务器</span>
      <i class="fa fa-chevron-right pull-right"></i>
    </a>
  </li>
  
</ul>


  
</article>




        </div>
        <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
          
  
  <div class="sidebar-module">
    <h4>Categories</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/apps/">apps</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/architecture/">architecture</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/">devops</a><span class="sidebar-module-list-count">10</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/kubectl/">kubectl</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/devops/kubernetes/">kubernetes</a><span class="sidebar-module-list-count">3</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/dotnet/">dotnet</a><span class="sidebar-module-list-count">3</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/dotnet/entityframework/">entityframework</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/elasticsearch/">elasticsearch</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/emacs/">emacs</a><span class="sidebar-module-list-count">4</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/emacs/org-mode/">org-mode</a><span class="sidebar-module-list-count">3</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/git/">git</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/graphql/">graphql</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/groovy/">groovy</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/">java</a><span class="sidebar-module-list-count">52</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/concurrent/">concurrent</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/jackson/">jackson</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/shiro/">shiro</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring/">spring</a><span class="sidebar-module-list-count">11</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-amqp/">spring-amqp</a><span class="sidebar-module-list-count">5</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-amqp/spring-jpa/">spring-jpa</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-jpa/">spring-jpa</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/spring-security/">spring-security</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/thymeleaf/">thymeleaf</a><span class="sidebar-module-list-count">2</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/java/thymeleaf/maven/">maven</a><span class="sidebar-module-list-count">1</span></li></ul></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/jenkins/">jenkins</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/journal/">journal</a><span class="sidebar-module-list-count">7</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/js/">js</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/">linux</a><span class="sidebar-module-list-count">35</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kde/">kde</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kross/">kross</a><span class="sidebar-module-list-count">3</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/kross/ktorrent-scripts/">ktorrent-scripts</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/shell/">shell</a><span class="sidebar-module-list-count">6</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/linux/tcp/">tcp</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/lisp/">lisp</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mongodb/">mongodb</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mssql/">mssql</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/mysql/">mysql</a><span class="sidebar-module-list-count">12</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/nginx/">nginx</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/node/">node</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/postgresql/">postgresql</a><span class="sidebar-module-list-count">2</span><ul class="sidebar-module-list-child"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/postgresql/client/">client</a><span class="sidebar-module-list-count">1</span></li></ul></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/python/">python</a><span class="sidebar-module-list-count">19</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/regex/">regex</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/rfc/">rfc</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/vim/">vim</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/categories/windows/">windows</a><span class="sidebar-module-list-count">7</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Tags</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/ReentrantLock/">ReentrantLock</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/nohup/">nohup</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/tags/pandoc/">pandoc</a><span class="sidebar-module-list-count">1</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Tag Cloud</h4>
    <p class="tagcloud">
      <a href="/tags/ReentrantLock/" style="font-size: 10px;">ReentrantLock</a> <a href="/tags/nohup/" style="font-size: 10px;">nohup</a> <a href="/tags/pandoc/" style="font-size: 10px;">pandoc</a>
    </p>
  </div>


  
  <div class="sidebar-module">
    <h4>Archives</h4>
    <ul class="sidebar-module-list"><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2919/06/">June 2919</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2022/03/">March 2022</a><span class="sidebar-module-list-count">58</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2022/01/">January 2022</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/11/">November 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/10/">October 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/04/">April 2021</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/03/">March 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/02/">February 2021</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2021/01/">January 2021</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/12/">December 2020</a><span class="sidebar-module-list-count">2</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/11/">November 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/10/">October 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/09/">September 2020</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/07/">July 2020</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/06/">June 2020</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/04/">April 2020</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/03/">March 2020</a><span class="sidebar-module-list-count">8</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/02/">February 2020</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2020/01/">January 2020</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/12/">December 2019</a><span class="sidebar-module-list-count">7</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/11/">November 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/10/">October 2019</a><span class="sidebar-module-list-count">11</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/09/">September 2019</a><span class="sidebar-module-list-count">6</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/08/">August 2019</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/07/">July 2019</a><span class="sidebar-module-list-count">10</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/06/">June 2019</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/05/">May 2019</a><span class="sidebar-module-list-count">3</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/04/">April 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/03/">March 2019</a><span class="sidebar-module-list-count">8</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/02/">February 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2019/01/">January 2019</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/11/">November 2018</a><span class="sidebar-module-list-count">4</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/10/">October 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/08/">August 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/07/">July 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/06/">June 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2018/03/">March 2018</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/07/">July 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/06/">June 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2017/04/">April 2017</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/2015/05/">May 2015</a><span class="sidebar-module-list-count">1</span></li><li class="sidebar-module-list-item"><a class="sidebar-module-list-link" href="/archives/1970/01/">January 1970</a><span class="sidebar-module-list-count">9</span></li></ul>
  </div>



  
  <div class="sidebar-module">
    <h4>Recents</h4>
    <ul class="sidebar-module-list">
      
        <li>
          <a href="/java/acessing-generic-types-at-runtime/">获取泛型类型</a>
        </li>
      
        <li>
          <a href="/linux/shell/bash_cgi/">Script for Shell Parsing Parameters</a>
        </li>
      
        <li>
          <a href="/linux/shell/shell-script/">Shell Script Getting Start</a>
        </li>
      
        <li>
          <a href="/linux/tcp/network-tcp-performance-turning-with-sysctl/">【翻译】Sysctl调节Linux网络性能</a>
        </li>
      
        <li>
          <a href="/java/concurrent/aqs-src/">AQS源码笔记</a>
        </li>
      
    </ul>
  </div>



        </div>
    </div>
  </div>
  <footer class="blog-footer">
  <div class="container">
    <div id="footer-info" class="inner">
      &copy; 2022 gdme1320<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

  

<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script> -->

<script src="/js/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>



<script src="/js/script.js"></script>

</body>
</html>
